Skip to content

feat(server-ai): stamp model metadata on AI usage events#192

Open
atornsii wants to merge 9 commits into
mainfrom
atornsii/AIC-2977/model-versioning-changes
Open

feat(server-ai): stamp model metadata on AI usage events#192
atornsii wants to merge 9 commits into
mainfrom
atornsii/AIC-2977/model-versioning-changes

Conversation

@atornsii

@atornsii atornsii commented Jul 14, 2026

Copy link
Copy Markdown

Requirements

  • I have added test coverage for new or changed functionality
  • I have followed the repository's pull request submission guidelines
  • I have validated my changes against all supported platform versions

Related issues

Describe the solution you've provided

Read modelKey and modelVersion from AI Config model payloads, expose them on the public model/tracking data types, and stamp them on every emitted tracker metric event. Model version defaults to 1, null/empty/whitespace model keys are omitted, and the resumption-token format remains unchanged.

Describe alternatives you've considered

This mirrors the established JavaScript and .NET SDK implementations.

Additional context

Depends on AIC-2876 for the backend payload fields.

Test plan

  • JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64 lib/sdk/server-ai/gradlew test -p lib/sdk/server-ai
  • JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64 lib/sdk/server-ai/gradlew build -p lib/sdk/server-ai
  • JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64 lib/sdk/server-ai/gradlew javadoc -p lib/sdk/server-ai
  • CI Java 8/11/17 matrix
Open in Web Open in Cursor 

cursoragent and others added 5 commits July 14, 2026 18:56
…oken test

Model.getModelKey() previously returned an empty string for a
blank-but-present modelKey payload value, contradicting its own Javadoc
contract and diverging from TrackData/tracker normalization. Trim it to
null in AIConfigParser like other string fields.

Also strengthen resumptionTokenExcludesModelMetadata to decode the token
and assert the wire format has no modelKey/modelVersion, rather than
relying solely on token equality across two trackers.

Co-authored-by: Cursor <[email protected]>
@atornsii
atornsii marked this pull request as ready for review July 14, 2026 19:47
@atornsii
atornsii requested a review from a team as a code owner July 14, 2026 19:47
@atornsii
atornsii marked this pull request as draft July 15, 2026 21:37
Gonfalon moved these two fields from the payload's model object to
_ldMeta (launchdarkly/gonfalon#67230) to avoid modelVersion reading as
the underlying LLM's own version. Field names are unchanged; only the
JSON location moves. Model's public getters and the tracker's stamped
event fields are untouched.

Co-Authored-By: Claude Fable 5 <[email protected]>
@atornsii
atornsii marked this pull request as ready for review July 16, 2026 16:55
atornsii and others added 2 commits July 16, 2026 14:53
Matches the same fix applied to the .NET SDK (dotnet-core PR #308):
parseModel reaching into _ldMeta mixed concerns — it should only parse
the model object. parseMeta now returns a small ModelIdentity holder
(modelKey, modelVersion) alongside populating the builder with the
other _ldMeta fields, and parseModel takes them as plain parameters
instead of fetching _ldMeta itself. No behavior change; full suite +
checkstyle pass.

Co-Authored-By: Claude Fable 5 <[email protected]>
…off holder

Follow-up to eb440b0: rather than a separate ModelIdentity class,
modelKey/modelVersion are now fields on AIConfigFlagValue.Builder
alongside enabled/variationKey/version/mode, set by parseMeta the same
way as the others. parseModel still only touches the model object,
reading modelKey/modelVersion from the builder as plain parameters.
No behavior change; full suite + checkstyle pass.

Co-Authored-By: Claude Fable 5 <[email protected]>

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using default effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, have a team admin enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 7a1e877. Configure here.

…del type

modelKey/modelVersion should only be visible via the tracker's stamped
event data, mirroring how variationKey/version are internal-only. They
now flow from the already-parsed _ldMeta fields straight into the
tracker factory instead of being attached to Model.

Co-Authored-By: Claude Sonnet 5 <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants